home *** CD-ROM | disk | FTP | other *** search
- /* HEADER: CUG120.24;
- TITLE: USERCODE;
- DATE: 12/00/1981;
- DESCRIPTION: "Extend the filename syntax for ALL file I/O to allow a user area prefix
- of the form n/ on all filenames.";
- KEYWORDS: input/output,user numbers;
- SYSTEM: CP/M 2.x;
- FILENAME: USERCODE.C;
- WARNINGS: "Doesn't work for writing a file into a different user area than the currently
- active one because of a CP/M bug.";
- CRC: 5E0B;
- AUTHORS: Leor Zolman;
- COMPILERS: BDS C;
- */
- /*
- USERCODE.C: A Nice Idea Killed By A Stupid CP/M MisFeature.....
-
- Idea: Extend the filename syntax for user with ALL file I/O to
- allow a user area prefix of the form "n/" on all filenames.
-
- Written by Leor Zolman, 12/81
-
- ****************************************************************
- ** FOR CP/M 2.x SYSTEMS ONLY!!! **
- ****************************************************************
-
-
- Generalized replacements for "open", "creat" and "unlink"
- library functions, allowing a user area prefix to be attached
- to all filenames (except those used as arguments to the "rename"
- function). The new filename syntax becomes:
-
- [whitespace][nn/][d:][filename.ext]
-
- E.g, to reference file "foo.bar" on the currently logged disk in
- user area 7, you'd use:
-
- 7/foo.bar
-
- To reference foo.bar in user area 9 on disk b:, you'd say:
-
- 9/b:foo.bar
-
- and so on. The user area prefix must always come first if both it and
- a disk designator need to be specified.
-
- NOTE: THIS WHOLE THING DOESN'T REALLY WORK FOR WRITING FILES INTO
- USER AREAS DIFFERENT FROM THE CURRENTLY ACTIVE USER AREA, BECAUSE
- GODDAMN CP/M DOESN'T LET YOU CLOSE A FILE THAT WAS OPENED IN A USER
- AREA DIFFERENT FROM THE CURRENTLY ACTIVE ONE. DAMN!!!!!!!!!!!!!!!!!!!
-
- To install this library, follow these steps:
- 1) compile this file (USERCODE.C)
- 2) invoke CLIB and give it the following commands:
- *o 0 usercode
- *o 1 deff2
- *e 1 open
- *a 0 open_old
- *e 1 creat
- *a 0 creat_old
- *e 1 unlink
- *a 0 unlink_old
- *c 0
- *q
- 3) Link the programs you wish to have recognize the user code
- on filenames by including "-f usercode" on the CLINK
- command line.
- */
-
- int open_old();
- int creat_old();
- int unlink_old();
-
- open(filename, mode)
- {
- return usercode(&open_old,filename,mode);
- }
-
- creat(filename)
- {
- return usercode(&creat_old,filename);
- }
-
- unlink(filename)
- {
- return usercode(&unlink_old,filename);
- }
-
- int usercode(funcptr, filename, extra_arg)
- int (*funcptr)();
- char *filename;
- int extra_arg;
- {
- int i, cur_user, new_user;
- char *savnam;
-
- while (isspace(*filename)) filename++; /* skip over whitespace */
- savnam = filename; /* save in case of false start */
-
- if (!isdigit(*filename)) return (*funcptr)(filename,extra_arg);
-
- cur_user = bdos(32, 0xff); /* save current user number */
- new_user = atoi(filename); /* get new user number */
- while (isdigit(*++filename)) /* skip over user number text */
- ;
- if (*filename != '/' || new_user > 31)
- return (*funcptr)(savnam,extra_arg);
- bdos(32,new_user);
- i = (*funcptr)(filename + 1,extra_arg);
- bdos(32,cur_user);
- return i;
- }
-
- omes:
-
- [whitespace][nn/][d:][filename.ext]
-
- E.g, to reference file "foo.bar" on the currently logged